function Node(value){
    this.value = value;
    this.next = null;
}
/**
 * 遍历一个链表，打印每个节点的数据
 * @param root 链表的根节点
 *
 * */
// function print(root) {
//     var node = root;
//     while(node){
//         console.log(node.value);
//         node = node.next;
//     }
// }

function print(root) {
    if(root){
        console.log(root.value);
        print(root.next);
    }
}

// function count(root) {
//     var node = root;
//     var num = 0;
//     while(node){
//         num++;
//         node = node.next;
//     }
//     return num;
// }
/**
 * @Description: 分治求链表长度
 * @author Ansel Chen
 * @date 2020/3/26
*/
function count(root) {
    if(!root) return 0;
    return 1 + count(root.next);
}


function getNode(root, index) {
    function _getValue(node, i) {
        if(!node) return null;
        if(i == index) return node;
        return _getValue(node.next,i + 1);
    }
    return _getValue(root , 0)
}

function setValue(root, index, value) {
    function _setValue(node,i) {
        if(!node) return;
        if(i === index){
            node.value = value;
        }else{
            _setValue(node.next, i + 1);
        }
    }
    _setValue(root,0);
}

/**
 * 插入新节点
 * @param node
 * @param value
 */
function insertNode(node,value) {
    var newNode = new Node(value);
    newNode.next = node.next;
    node.next = newNode;
}

/**
 * 在节点末尾加入新节点
 * @param root
 * @param value
 */
function push(root,newValue) {
    if(!root.next){
        var newNode = new Node(newValue);
        root.next = newNode;
    }else {
        push(root.next, newValue);
    }
}

/**
 * 根据给定的链表和给定的要删除的值，删除对应节点
 * @param root
 * @param nodeValue
 */
function removeNode(root, nodeValue) {
    if(!root || !root.next) return;
    if(root.next.value == nodeValue){
        root.next = root.next.next;
    }else{
        removeNode(root.next, nodeValue);
    }
}

/**
 * 将链表倒叙
 * @param root
 */
function reverse(root) {
    if(!root || !root.next) return root;
    if(!root.next.next){
        var temp = root.next;
        root.next.next = root;
        root.next = null;
        return temp;
    }else{
        var temp = reverse(root.next);
        root.next.next = root;
        root.next = null;
        return temp;
    }
}
var a = new Node("a");
var b = new Node("b");
var c = new Node("c");

a.next = b;
b.next = c;

// console.log(a);
// print(a);
// console.log(count(a));
// console.log(getNode(a,2));
// setValue(a,2,"hello");
// insertNode(b,"haha");
// push(a,"haha");
// removeNode(a,"b");
var temp = reverse(a);
print(temp);
